//Начальная версия
//При передаче динамического списка запускать расширенный редактор его настроек 

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	
	ВспомогательныеДанныеИнструмента	= Новый Структура;
	ВспомогательныеДанныеИнструмента.Вставить("ПроизвольныеЗначения", Новый Структура);
	
	
	ПроизвольныеЗначения	= Параметры.ПроизвольныеЗначения;
	
	
	Для Каждого КлючИЗначение Из ПроизвольныеЗначения Цикл
		
		ТекущееИмя			= КлючИЗначение.Ключ;
		ТекущееЗначение		= КлючИЗначение.Значение;
		ТипЗначения			= ТипЗнч(ТекущееЗначение);
		
		//ДобавляемыеРеквизиты	= Новый Массив;
		
		Если ТипЗначения = Тип("ДанныеФормыКоллекция") ИЛИ ТипЗначения = Тип("ДанныеФормыДерево") Тогда
			
			ДанныеЗначения	= ТекущееЗначение.Выгрузить(Новый Массив);
			
			ДобавитьРеквизитНаФорму(ЭтотОбъект, ТекущееИмя, НовыйОписаниеТипов(ТипЗнч(ДанныеЗначения)));
			
			Для Каждого ТекущаяКолонка Из ДанныеЗначения.Колонки Цикл
				//Попытка
					ДобавитьРеквизитНаФорму(ЭтотОбъект, ТекущаяКолонка.Имя, ТекущаяКолонка.ТипЗначения, ТекущееИмя, ТекущаяКолонка.Заголовок);
				//Исключение
				//КонецПопытки;
			КонецЦикла;
			
			//ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
			КопироватьДанныеФормы(ТекущееЗначение,ЭтотОбъект[ТекущееИмя]);
			
		ИначеЕсли ТипЗначения = Тип("Структура") ИЛИ ТипЗначения = Тип("Соответствие") Тогда
			
			ДобавитьРеквизитНаФорму(ЭтотОбъект, ТекущееИмя, НовыйОписаниеТипов(Тип("ДеревоЗначений")));
			ДобавитьРеквизитНаФорму(ЭтотОбъект, "Ключ", Новый ОписаниеТипов, ТекущееИмя);
			ДобавитьРеквизитНаФорму(ЭтотОбъект, "ЭтоСтруктура", Новый ОписаниеТипов("Булево"), ТекущееИмя);
			ДобавитьРеквизитНаФорму(ЭтотОбъект, "ЭтоСоответствие", Новый ОписаниеТипов("Булево"), ТекущееИмя);
			ДобавитьРеквизитНаФорму(ЭтотОбъект, "Значение", Новый ОписаниеТипов, ТекущееИмя);
			
			ЗаполнитьДеревоИзСтруктурыСоответствия(ТекущееЗначение, ЭтотОбъект[ТекущееИмя]);
			
		Иначе
			
			ДобавитьРеквизитНаФорму(ЭтотОбъект, ТекущееИмя, НовыйОписаниеТипов(ТипЗнч(ДанныеЗначения)));
			ЗаполнитьЗначенияСвойств(Элементы.Найти(ТекущееИмя), Новый Структура(
			"ПоложениеЗаголовка						, АвтоМаксимальнаяШирина	, МногострочныйРежим", 
			ПоложениеЗаголовкаЭлементаФормы.Нет		, Ложь						, Истина));
			
			ЭтотОбъект[ТекущееИмя]	= ТекущееЗначение;
			
		КонецЕсли;
		
		ВспомогательныеДанныеИнструмента.ПроизвольныеЗначения.Вставить(ТекущееИмя);

	КонецЦикла;
	
	
	
		
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Команда_Применить(Команда)
	
	ЗаполнитьЗначенияСвойств(ВспомогательныеДанныеИнструмента.ПроизвольныеЗначения, ЭтотОбъект);
	Закрыть(ВспомогательныеДанныеИнструмента.ПроизвольныеЗначения);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура ЗаполнитьДеревоИзСтруктурыСоответствия(ТекущееЗначение, ТекущийРодитель)
	
	Если НЕ ЭтоСтруктура(ТекущееЗначение) И НЕ ЭтоСоответствие(ТекущееЗначение) Тогда
		Возврат;
	КонецЕсли;
	
	КоллекцияСтрок = ТекущийРодитель.ПолучитьЭлементы();
	Для Каждого КлючИЗначение Из ТекущееЗначение Цикл
		
		ОписаниеСтроки = КоллекцияСтрок.Добавить();
		ОписаниеСтроки.Ключ = КлючИЗначение.Ключ;
		
		НуждоПробежать = Истина;
		Если ЭтоСтруктура(КлючИЗначение.Значение) Тогда
			ОписаниеСтроки.ЭтоСтруктура = Истина;
		ИначеЕсли ЭтоСоответствие(КлючИЗначение.Значение) Тогда
			ОписаниеСтроки.ЭтоСоответствие = Истина;
		Иначе
			НуждоПробежать = Ложь;
		КонецЕсли;
		
		Если НуждоПробежать Тогда
			ЗаполнитьДеревоИзСтруктурыСоответствия(КлючИЗначение.Значение, ОписаниеСтроки);
		Иначе
			ОписаниеСтроки.Значение = КлючИЗначение.Значение;
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЭтоСтруктура(Значение)
	
	ТипТекЗнч = ТипЗнч(Значение);
	Возврат ТипТекЗнч = Тип("Структура") ИЛИ ТипТекЗнч = Тип("ФиксированнаяСтруктура");
	
КонецФункции

&НаСервереБезКонтекста
Функция ЭтоСоответствие(Значение)
	
	ТипТекЗнч = ТипЗнч(Значение);
	Возврат ТипТекЗнч = Тип("Соответствие") ИЛИ ТипТекЗнч = Тип("ФиксированноеСоответствие");
	
КонецФункции

&НаСервереБезКонтекста
Процедура ДобавитьРеквизитНаФорму(Форма, Имя, ТипЗначения, Путь = "", Заголовок = Неопределено)
	
	ДобавитьРеквизитФормы(Форма, Имя, ТипЗначения, Путь, Заголовок);
	
	//@skip-check structure-consructor-too-many-keys
	ОписаниеЭлемента	= Новый Структура(
	"Видимость	, Доступность	, ТолькоПросмотр	, Вид						, ПутьКДанным",
	Истина		, Истина		, Ложь				, ВидПоляФормы.ПолеФлажка	, "");
	
	Если ТипЗначения.СодержитТип(Тип("ТаблицаЗначений")) Тогда
		ТипЭлемента	= Тип("ТаблицаФормы");
	Иначе
		ТипЭлемента	= Тип("ПолеФормы");
		Если ТипЗначения.СодержитТип(Тип("Булево")) И ТипЗначения.Типы().Количество() = 1 Тогда
			ОписаниеЭлемента.Вид	= ВидПоляФормы.ПолеФлажка;
		Иначе
			ОписаниеЭлемента.Вид	= ВидПоляФормы.ПолеВвода;
		КонецЕсли;
	КонецЕсли;
	
	ОписаниеЭлемента.ПутьКДанным	= ?(ПустаяСтрока(Путь), "", Путь + ".") + Имя;
	
	НовыйЭлемент	= Форма.Элементы.Добавить(Имя, ТипЭлемента, Форма.Элементы.Найти(Путь));
	ЗаполнитьЗначенияСвойств(НовыйЭлемент, ОписаниеЭлемента);
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДобавитьРеквизитФормы(Форма, Имя, ТипЗначения, Путь = "", Заголовок = Неопределено)
	
	НовыйРеквизитФормы	= Новый РеквизитФормы(Имя, ТипЗначения, Путь, Заголовок, Ложь);
	
	Форма.ИзменитьРеквизиты(ЗначениеВМассиве(НовыйРеквизитФормы));
	
	Возврат НовыйРеквизитФормы;

КонецФункции

&НаКлиентеНаСервереБезКонтекста
// Создает массив и помещает в него переданное значение.
//
// Параметры:
//  Значение - Произвольный - любое значение.
//
// Возвращаемое значение:
//  Массив - массив из одного элемента.
//
Функция ЗначениеВМассиве(Значение)
	
	Массив = Новый Массив;
	Массив.Добавить(Значение);
	
	Возврат Массив;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
// Преобразует к описанию типов
//
// Параметры:
//  ПараметрТип  - ОписаниеТипов, Строка, Тип, Массив, СписокЗначений, Структура     - тип или коллекция типо для преобразование в ОписаниеТипов
//  ВПопытке     - булево                                                             - если Истина, тогда преобразование проискодит в попытке (мало ли) и при ошибке возвращает пустое описание типов
//
// Возвращаемое значение:
//   ОписаниеТипов   - результат преобразования
//
Функция НовыйОписаниеТипов(ПараметрТип, ВПопытке = Истина)
	
	Если ВПопытке Тогда
		
		Попытка
			ОписаниеТипов = НовыйОписаниеТипов(ПараметрТип, Ложь);
		Исключение
			ОписаниеТипов = Новый ОписаниеТипов();
		КонецПопытки;
		
	Иначе
		
		ОписаниеТипов = Новый ОписаниеТипов();
		
		Если ПараметрТип = Неопределено Тогда
			//Пустое описание
		ИначеЕсли ТипЗнч(ПараметрТип) = Тип("ОписаниеТипов") Тогда
			ОписаниеТипов = ПараметрТип;
		ИначеЕсли ТипЗнч(ПараметрТип) = Тип("Строка") Тогда
			ОписаниеТипов = Новый ОписаниеТипов(ПараметрТип);
		ИначеЕсли ТипЗнч(ПараметрТип) = Тип("Тип") Тогда
			ОписаниеТипов = Новый ОписаниеТипов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПараметрТип));
		ИначеЕсли ТипЗнч(ПараметрТип) = Тип("Массив") Тогда
			Для Каждого Тип Из ПараметрТип Цикл
				ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, НовыйОписаниеТипов(Тип).Типы());
			КонецЦикла;
		ИначеЕсли ТипЗнч(ПараметрТип) = Тип("СписокЗначений") ИЛИ ТипЗнч(ПараметрТип) = Тип("Структура") Тогда
			Для Каждого Тип Из ПараметрТип Цикл
				ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, НовыйОписаниеТипов(Тип.Значение).Типы());
			КонецЦикла;
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат ОписаниеТипов;
	
КонецФункции

#КонецОбласти
